-- TODO-REBARE: should be UNSAFE, but is currently NOT 

module LiquidClass where


-- | Typing classes
-- | Step 1: Refine type dictionaries:

class Compare a where
  cmax :: a -> a -> a
  cmin :: a -> a -> a

instance Compare Int where	
  {-@ instance Compare Int where 
	cmax :: Odd -> Odd -> Odd ;
	cmin :: Int -> Int -> Odd
    @-}
  cmax y x = if x >= y then x else y
  cmin y x = if x >= y then x else y

-- | creates dictionary environment:
-- | * add the following environment
-- | dictionary $fCompareInt :: Compare Int
-- |               { $ccmax :: Odd -> Odd -> Odd
-- |               , $ccmin :: Int -> Int -> Int
-- |               }
-- |
-- | Important: do not type dictionaries, as preconditions
-- | of fields cannot be satisfied!!!!!


-- | Dictionary application 
-- | ((cmax Int)    @fcompareInt) :: Odd -> Odd -> Odd
-- | ((cmin Int)    @fcompareInt) :: Int -> Int -> Int
-- | (anything_else @fcompareInt) :: default


{-@ foo :: Odd -> Odd -> Odd @-}
foo :: Int -> Int -> Int
foo x y = cmax x y 
